Skip to main content

Diálogo: Configuración del proyecto: Luz de análisis estático

Símbolo: _cds_icon_stat_analy_light.png

Función: El cuadro de diálogo activa las comprobaciones que se realizan con la versión ligera de CODESYS Análisis estático cada vez que se genera el código.

Llamar: Proyecto → Configuración del proyecto mando, Luz de análisis estático categoría

Sugerencia

Puede excluir líneas de código del análisis de código estático marcando el código con el {analysis ...} pragma o el {attribute 'analysis' := '...'} pragma.

Para más información, ver: Analizar código estáticamente

Comprobaciones de compilación adicionales

SA0033: Variables no utilizadas

Detecta variables que se declaran pero no se usan dentro del código del programa compilado

Para variables GVL: si existen varias aplicaciones en un proyecto, solo se verán afectados los objetos debajo de la aplicación actualmente activa. Si sólo hay una aplicación, entonces los objetos en el POUs vista también se ven afectados.

SA0028: Áreas de memoria superpuestas

Detecta las líneas de código donde dos o más variables reservan la misma memoria

Por ejemplo, esto ocurre para las siguientes declaraciones: var1 AT %QB21: INT y var2 AT %QD5: DWORD. En este caso, ambas variables utilizan el byte 21, lo que significa que el rango de memoria de las variables se superpone.

SA0006: Acceso de escritura desde varias tareas

Detecta variables en las que escribe más de una tarea

SA0004: acceso de escritura múltiple en la salida

Detecta salidas que se escriben en más de una ubicación

Nota: No se emite un error cuando una variable de salida (VAR_IN_OUT) se escribe en diferentes ramas de IF y CASE declaraciones.

Nota: un pragma no puede deshabilitar esta regla.

SA0027: Múltiples usos de identificadores

Detecta múltiples usos de un nombre/identificador para una variable o un objeto (POU) dentro del alcance de un proyecto

. Se detectan los siguientes casos:
  • El nombre de una constante de enumeración es el mismo que en otra enumeración de la aplicación o se usa en una biblioteca incluida.

  • El nombre de una variable es el mismo que el nombre de un objeto en la aplicación o el nombre de una biblioteca integrada.

  • El nombre de una variable es el mismo que el nombre de una constante de enumeración en una enumeración en la aplicación o el nombre de una biblioteca integrada.

  • El nombre de un objeto es el mismo que el nombre de otro objeto en la aplicación.

  • El nombre de una variable es el mismo que el nombre de un método.

  • El nombre de un objeto es el mismo que el nombre de un objeto superior ("objeto principal").

SA0167: Informar instancias temporales de FunctionBlock

La comprobación detecta instancias de bloques de funciones que se declaran como variables temporales. Esto afecta a las instancias que se declaran en un método o función o como VAR_TEMP, y por lo tanto se reinicializan en cada ciclo de procesamiento o para cada llamada de POU.

SA0175: Operación sospechosa en cadena

Inactivo por defecto

Detecta ubicaciones de código sospechosas de codificación UTF-8

Se incluyen las siguientes construcciones:

  • Índice de acceso a una cadena de un solo byte

    Ejemplo: str[2]

    Mensaje: Operación sospechosa en cadena: acceso de índice '<expresión>'

  • Acceso de dirección a una cadena de un solo byte

    Ejemplo: ADR(str)

    Mensaje: Operación sospechosa en cadena: Posible acceso al índice '<expresión>'

  • Llamar a una función de cadena de la biblioteca estándar excepto CONCAT y LEN

    Mensaje:  Operación sospechosa en la cadena: posible acceso al índice '<expresión>'

  • Literal de un solo byte que contiene caracteres no ASCII

    Ejemplo:

    str := '99€';

    str := 'Ä';

    Mensaje: Operación sospechosa en la cadena: el literal '<literal>' contiene caracteres que no son ASCII

En función del resultado de la comprobación, se aconseja no habilitar el Codificación UTF8 para STRING opción de compilación.

Para más información, ver: Opciones de compilación

ejemplo 544. Ejemplos

SA0003: Sentencias vacías

;
(* Comment *);
iVar;

SA0006: Acceso concurrente

FUNCTION_BLOCK ADD_FB
g_iTemp1 := g_iTemp1 + INT#1;
PROGRAM PLC_PRG  //controlled by MainTask
g_iTemp1 := g_iTemp1 + INT#2;
g_xTemp2 := g_iTemp1 > INT#10;
PROGRAM PLC_PRG_1  //controlled by SubTask
g_iTemp1 := g_iTemp1 - INT#3;
g_xTemp2 := g_iTemp1 < INT#-10;

SA0004: Acceso de escritura múltiple en la salida

VAR_GLOBAL
    g_xVar AT %QX0.0 : BOOL ;
    g_iTest AT %QW0 : INT ;
END_VAR
PROGRAM PLC_PRG
IF iCondition < INT#0 THEN
    g_xVar := TRUE;
    g_iTest := INT#12;
END_IF
CASE iCondition OF
    INT#1:
        g_xVar := FALSE;
    INT#2:
        g_iTest := INT#11;
    ELSE
        g_xVar := TRUE;
        g_iTest := INT#9;
END_CASE

SA0006: Acceso de escritura desde varias tareas

FUNCTION_BLOCK ADD_FB
g_iTemp1 := g_iTemp1 + INT#1;
PROGRAM PLC_PRG  // Controlled by MainTask
g_iTemp1 := g_iTemp1 + INT#2;
g_xTemp2 := g_iTemp1 > INT#10;
PROGRAM PLC_PRG_1  //Controlled by SubTask
g_iTemp1 := g_iTemp1 - INT#3;
g_xTemp2 := g_iTemp1 < INT#-10;

SA0027: Uso múltiple del nombre

PROGRAM PLC_PRG
VAR
    ton : INT; // error SA0027
END_VAR

SA0029: Notación en código diferente a declaración

A PLC_PRG POU y un fnc (función) POU existe en el árbol de dispositivos.

PROGRAM PLC_PRG
VAR
    iVar:INT;
    _123test_var_: INT;
END_VAR
ivar := iVar + 1; // notation different to that in the declaration part ->   SA0029
_123TEST_var_ := _123test_var_INT; // notation different to that in the declaration part ->   SA0029
Fnc(); // notation different to that in the devices tree ->   SA0029

SA0167: Informar instancias temporales de FunctionBlock

PROGRAM PLC_PRG
VAR
END_VAR
VAR_TEMP
    yafb: AFB;
END_VAR

FUNCTION Fun : INT
VAR_INPUT
END_VAR
VAR
    funafb: AFB;
END_VAR
METHOD METH: INT
VAR_INPUT
END_VAR
VAR
    methafb: AFB;
END_VAR


Para más información, ver: Analizar código estáticamente